<p>When using Spring proxies, calling a method in the same class (e.g. <code>this.aMethod()</code>) with an incompatible <code>@Transactional</code>
requirement will result in runtime exceptions because Spring only "sees" the caller and makes no provisions for properly invoking the callee.</p>
<p>Therefore, certain calls should never be made within the same class:</p>
<table>
  <colgroup>
    <col style="width: 50%;">
    <col style="width: 50%;">
  </colgroup>
  <thead>
    <tr>
      <th>From</th>
      <th>To</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><p>non-<code>@Transactional</code></p></td>
      <td><p>MANDATORY, NESTED, REQUIRED, REQUIRES_NEW</p></td>
    </tr>
    <tr>
      <td><p>MANDATORY</p></td>
      <td><p>NESTED, NEVER, NOT_SUPPORTED, REQUIRES_NEW</p></td>
    </tr>
    <tr>
      <td><p>NESTED</p></td>
      <td><p>NESTED, NEVER, NOT_SUPPORTED, REQUIRES_NEW</p></td>
    </tr>
    <tr>
      <td><p>NEVER</p></td>
      <td><p>MANDATORY, NESTED, REQUIRED, REQUIRES_NEW</p></td>
    </tr>
    <tr>
      <td><p>NOT_SUPPORTED</p></td>
      <td><p>MANDATORY, NESTED, REQUIRED, REQUIRES_NEW</p></td>
    </tr>
    <tr>
      <td><p>REQUIRED or <code>@Transactional</code></p></td>
      <td><p>NESTED, NEVER, NOT_SUPPORTED, REQUIRES_NEW</p></td>
    </tr>
    <tr>
      <td><p>REQUIRES_NEW</p></td>
      <td><p>NESTED, NEVER, NOT_SUPPORTED, REQUIRES_NEW</p></td>
    </tr>
    <tr>
      <td><p>SUPPORTS</p></td>
      <td><p>MANDATORY, NESTED, NEVER, NOT_SUPPORTED, REQUIRED, REQUIRES_NEW</p></td>
    </tr>
  </tbody>
</table>
<h2>Noncompliant Code Example</h2>
<pre>
@Override
public void doTheThing() {
  // ...
  actuallyDoTheThing();  // Noncompliant
}

@Override
@Transactional
public void actuallyDoTheThing() {
  // ...
}
</pre>

